package cn.wolfcode.controller;

import cn.wolfcode.annotation.RequireLogin;
import cn.wolfcode.domain.UserInfo;
import cn.wolfcode.redis.IUserInfoRedisService;
import cn.wolfcode.redis.util.RedisKeysUtil;
import cn.wolfcode.service.IUserInfoService;
import cn.wolfcode.util.JsonResult;
import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;

/**
 * @Description: TODO
 * @Author: 伍家钰
 * @Date: 2020/8/7 15:43
 * @Version: 1.0
 */
@RestController
@RequestMapping("users")
public class UserInfoController {
    @Resource
    private IUserInfoService userInfoService;
    @Resource
    private IUserInfoRedisService userInfoRedisService;

    /**
     * 查询单个用户信息
     *
     * @return :返回查询出的对象
     */
    @GetMapping("get")
    public UserInfo getUserInfoById(String id) {
        return userInfoService.get("5e92d6cdacd8de311e99c99e");
    }

    /**
     * 验证手机号是否被注册
     *
     * @param phone:用户填入的手机号
     * @return :true:手机号已经被注册 ; false:手机号未被注册
     */
    @GetMapping("checkPhone")
    public boolean checkPhone(String phone) {
        String userPhone = userInfoService.checkPhone(phone);
        boolean isExist = userPhone != null;
        return !isExist;
    }

    /**
     * 发送验证码,生成验证码并存储到redis中
     *
     * @param phone
     * @return
     */
    @GetMapping("sendVerifyCode")
    public Object sendVerifyCode(String phone) {
        // 将验证码保存到redis缓存中
        userInfoRedisService.saveCode(phone);
        return JsonResult.success();
    }

    /**
     * 验证用户名是否被注册
     *
     * @param name
     * @return
     */
    @GetMapping("checkName")
    public Object checkName(String name) {
        String userName = userInfoService.checkName(name);
        return userName != null;
    }

    /**
     * 用户注册
     *
     * @param phone:手机号
     * @param nickname:昵称
     * @param password:密码
     * @param rpassword:确认密码
     * @param verifyCode:验证码
     * @return :返回JsonResult格式数据
     */
    @PostMapping("regist")
    public Object regist(String phone, String nickname, String password, String rpassword, String verifyCode) {
        // 调用注册方法
        userInfoService.regist(phone, nickname, password, rpassword, verifyCode);
        return new JsonResult<>(JsonResult.CODE_SUCCESS, "注册成功", null);
    }

    /**
     * 用户登入
     *
     * @param username:账号
     * @param password:密码
     * @return
     */
    @PostMapping("login")
    public Object login(String username, String password) {
        // 1.获取登入账号和密码,根据用户的账号密码查询用户对象
        UserInfo userInfo = userInfoService.findByPhoneAndPassword(username, password);

        // 2.判断user对象是否为空,为空则登入失败,并且提示账号和密码不正确(在业务逻辑实现类中完成)

        // 5.将对token和user对象使用json格式返回给浏览器
        String token = userInfoRedisService.saveToken(userInfo);
        HashMap<String, Object> map = new HashMap<>();
        // 将对象的密码设置为空字符串,防止在浏览器的控制台中暴露密码
        userInfo.setPassword("");
        map.put("token", token);
        map.put("user", userInfo);
        return JsonResult.success(map);
    }

    /**
     * 二次登入时获取当前登入对象,限制必须登入才能访问
     *
     * @param req
     * @return
     */
    @RequireLogin
    @GetMapping("/currentUser")
    public Object currentUser(HttpServletRequest req) {
        // 1.获取请求头
        String token = req.getHeader("token");
        UserInfo userInfo = userInfoRedisService.getByToken(token);
        return JsonResult.success(userInfo);
    }

}
